package Algoritmo;

import Grafica.Vertice;
import java.util.LinkedList;
import InterfazPantera.PanteraView;

/**
 *
 * @author robertoanzaldua
 */
public class CicloEuleriano extends Algoritmo{
    
    
    private StringBuilder C = new StringBuilder("C = {");
    private StringBuilder E = new StringBuilder("ε = {");
    private StringBuilder P = new StringBuilder("P = {");
    private Vertice sel;
    private LinkedList<Vertice> vertDeC;

    public CicloEuleriano(PanteraView interfaz){
        super(interfaz,"Euleriano");
    }
 
  public void ejecutaPaso(){
        if(clics<2)
        switch(clics){
            case 0:
                vertAleat = numA(G.numV);
                vertDeC = new LinkedList();
                sel = G.getV(vertAleat);
                vertDeC.add(sel);
                C.append("V"+vertAleat);
                interfaz.agregaADesarrollo(C.toString()+"}\n\n");
                G.marcaVerticePerm(vertAleat, "brown");
                break;
            case 1:
                interfaz.cambiaPaso(0, 1);
                String a = G.aristas();
                E.append(a.substring(1,a.length()-1));
                interfaz.agregaADesarrollo(E.toString()+"}\n\n");
                break;
        }
        else
        switch(clics0%6){
            case 0:
                vertAleat = existenAristas();
                if(vertAleat!=-1){
                cambiaPaso(esActual(1) ? 1 : 10,2);
                int j = G.getV(vertAleat).disp().nV();
                marcaArista(vertAleat, j, "red", false);
                dibuja();
                interfaz.agregaADesarrollo("La arista V"+vertAleat+"V"+j+" está disponible y marcada en rojo\n");
                clics0++;
                }else{
                    cambiaPaso(10,2);
                    interfaz.agregaADesarrollo("No Existen más aristas en ε\n");
                    cambiaPaso(2,11);
                    String[]c = C.toString().split("[.+,]{5}");
                    C = new StringBuilder();
                    for(String s : c){
                        C.append(s+"\n");
                    }
                    interfaz.agregaADesarrollo(C+"}\n es el ciclo euleriano\n");
                    return;
                }

                break;
            case 1:
                int  j = G.disp(vertAleat).nV();
                marcaArista(vertAleat, j, "black", false);
                dibuja();
                for(Vertice v:vertDeC)
                    if(v.disp()!=null)
                        vertAleat = v.nV();
                j = G.disp(vertAleat).nV();
                this.marcaArista(vertAleat, j, "red", false);
                dibuja();
                cambiaPaso(nulo(2) ? 10 : 2,3);
                interfaz.agregaADesarrollo("El vértice V"+vertAleat+" tiene la arista en rojo disponible\n");
                clics0++;
                break;
            case 2:
                cambiaPaso(3,4);
                P = new StringBuilder("V"+vertAleat);
                interfaz.agregaADesarrollo("P=V"+vertAleat+";\n");
                clics0++;
                break;
            case 3:
                cambiaPaso(4,5);
                interfaz.agregaADesarrollo("u=V"+vertAleat+";\n");
                clics0++;
                break;
            case 4:
                switch(clics1%4){
                case 0:
                    desactiva(10);
                    cambiaPaso(esActual(5) ? 5 : 9,6);
                    if(G.disp(vertAleat)!=null){
                    adyVertAleat = G.disp(vertAleat).nV();
                    this.marcaArista(vertAleat, adyVertAleat, "blue", true);
                    dibuja();
                    interfaz.agregaADesarrollo("e = V"+vertAleat+"V"+ G.disp(vertAleat).nV()+"\n");
                    vertDeC.add(G.getV(G.disp(vertAleat).nV()));
                    clics1++;
                    }else{
                       interfaz.agregaADesarrollo("El vértice V"+vertAleat+" ya no tiene aristas disponibles\n");
                       clics0 = 5;
                    }

                    break;
                case 1:
                    cambiaPaso(6,7);
                    interfaz.agregaADesarrollo("Se ha eliminado a la arista: V"+vertAleat+"V"+ G.disp(vertAleat).nV()+"\n");
                    G.eliminaArista(vertAleat, adyVertAleat);
                    clics1++;
                    break;
                case 2:
                    cambiaPaso(7,8);
                    P.append(",V"+vertAleat+"V"+ adyVertAleat+","+"V"+ adyVertAleat);
                    interfaz.agregaADesarrollo("P = "+P.toString()+"\n");
                    interfaz.agregaADesarrollo("P = V"+vertAleat+",V"+vertAleat+"V"+ adyVertAleat +","+"V"+ adyVertAleat+"\n");
                    clics1++;
                    break;
                case 3:
                    cambiaPaso(8,9);
                    interfaz.agregaADesarrollo("u = V"+ adyVertAleat+"\n");
                    vertAleat = adyVertAleat;
                    clics1++;
                    break;
               }
                break;

            case 5:
                    cambiaPaso(6,10);
                    int empza = C.toString().lastIndexOf("V"+vertAleat);
                    int tmna = C.toString().lastIndexOf("V"+vertAleat) + ("V"+vertAleat).length();
                    C.replace(empza, tmna, P.toString());
                    interfaz.agregaADesarrollo("Se ha sustituído V"+sel.nV()+" por "+P.toString()+" en C\n"+"\n");
                    interfaz.agregaADesarrollo("\n"+C+"}\n");
                    clics0++;
                    break;
        }
        clics++;
    }


    @Override
 public boolean preCondiciones(){
     if(super.preCondiciones()==false)
         return false;


     int[]grados = new int[G.numV];
     for(int i=0;i<G.numV;i++){
       grados[i] = G.getV(i).ady().size();
     }
    
       boolean sonPares = true;
       for(int i : grados)
           if(i%2==1){
               sonPares = false;
               break;
           }

       if(!sonPares){
           dibujaGr();
           enviaMensaje("!El grado de los vértices en rojo es impar,! \n No es posible aplicar el algoritmo.");
           return false;
       }

       if(!G.tieneAristas()){
        enviaMensaje("La gráfica no contiene aristas, " +
               "será regresado a la pestaña de diseño");
        return false;
       }

       return true;
    }

}
